package continuity;

/**
 * Zetor csapat szekelton
 * 
 * A program célja hogy a modellről eldönthető legyen, hogy a feladat egy helyes
 * megoldását nyújtja.
 * 
 * @author Balogh Peter Tamas
 * @author Gál István László
 * @author Kárász Gábor
 * @author Simon Endre András
 * @author Szabó Alex
 */
import java.util.ArrayList;

public class Game {

    private Clock clock;
    private ArrayList<Level> level;
    private SpriteFactory factory;
    private Character character;
    private int view;
    // a szkeleton segítésére szolgáló
    // változók
    // ClassName - osztály neve, osztályszintű változó
    // name - objektum neve
    static public String className = "Game";
    public String name;
    //

    // A konstruktorok kaptak egy segítő paramétert,
    // az objektum elnevezésének megkönnyítésére.
    public Game(String n) {
        level = new ArrayList<Level>();
        level.add(new Level("level1"));
        name = n;
    }

    // játék újraindítása
    public void restartGame() {
        String classInfo = "Game::RestartGame(): void";
        Continuity.methodEntry(classInfo);

        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    // Óra eseménykezelő
    // feladata hogy eljuttassa az óraütéseket a megfelelő
    // objektumoknak.
    public void Tick() {
        String classInfo = "Game::Tick(): void";
        Continuity.methodEntry(classInfo);

        Continuity.methodCall(className, name, Level.className, level.get(0).name, "Tick(): void");
        level.get(0).Tick();

        character = new Character(new Point3d(), this, "character");
        Continuity.methodCall(className, name, Character.className, character.name, "Tick(): void");
        character.Tick();

        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }
    // elindítja a játékot és létrehozza a szükséges
    // objektumokat ( pálya, pályaelemek, karakter, fal, 
    // kulcs, ajtó).

    public void startGame() {
        String classInfo = name + "(" + className + ")::startGame(): void";
        Continuity.methodEntry(classInfo);
        Continuity.methodCall(className, name, className, name, "loadGame(10): void");
        loadGame();
        Continuity.methodExit(classInfo);
    }

    // start előtti objektumok betöltése (pl. Clock, SpriteFactory) 
    public void loadGame() {
        String classInfo = name + "(" + className + ")::loadGame(): void";
        Continuity.methodEntry(classInfo);

        level.add(new Level("level2"));
        Continuity.methodCreate(className, name, Level.className, level.get(1).name);
        Continuity.Loop("Összes pályaelem generálása");
        LevelItem n = new LevelItem("LevelItem");
        Continuity.methodCreate(className, name, LevelItem.className, n.name);
        Continuity.methodCall(className, name, Level.className, level.get(1).name, "addLevelItem(" + n.name + "): void");
        level.get(1).addLevelItem(n);

        Continuity.LoopEnd();

        Continuity.Loop("Spriteok keszitese");
        Continuity.methodCall(className, name, SpriteFactory.className, factory.name, "createSprite(type): void");
        Sprite s = factory.createSprite(1);
        Continuity.methodReturn(className, name, Level.className, level.get(1).name, ((Key) s).name + "(" + Key.className + ")");
        Continuity.methodCall(className, name, LevelItem.className, n.name, "addSprite(" + n.name + "): void");
        n.addSprite(s);
        Continuity.LoopEnd();
        Continuity.methodCall(className, name, Level.className, level.get(1).name, "addCharacter(" + character.name + "): void");
        level.get(1).addCharacter(character);


        Continuity.methodExit(classInfo);
        Continuity.methodVoid();

        Continuity.methodDestroy(className, name, Character.className, character.name);
        Continuity.Loop("Spriteok torlese");
        Continuity.methodDestroy(className, name, Key.className, ((Key) s).name);
        Continuity.LoopEnd();

        Continuity.Loop("Osszes LevelItem torlese");
        Continuity.methodDestroy(className, name, LevelItem.className, n.name);
        Continuity.LoopEnd();

        Continuity.methodDestroy(className, name, Level.className, level.get(1).name);

        if (Continuity.Question("Mentsuk a jatekot?", 'y', 'n')) {
            Continuity.Alt("Jatek mentese");
            Continuity.methodCall(className, name, className, name, "saveGame(): void");
            saveGame();
            Continuity.AltEnd();
        } else {
            Continuity.Alt("Nincs mentes");

            Continuity.AltEnd();
        }
    }

    // a konstruktor feladatát látja el
    public void init() {
        String classInfo = "Game::init(): void";
        Continuity.methodEntry(classInfo);

        clock = new Clock(this, "c");
        Continuity.methodCreate(className, name, Clock.className, clock.name);
        Continuity.methodCall(className, name, Clock.className, clock.name, "setPeriod(10): void");
        clock.setPeriod(10);

        factory = new SpriteFactory();
        Continuity.methodCreate(className, name, SpriteFactory.className, factory.name);
        Continuity.methodCall(className, name, SpriteFactory.className, factory.name, "setGame(" + name + "): void");
        factory.setGame(this);

        character = new Character(new Point3d(), this, "character");
        Continuity.methodCreate(className, name, Character.className, character.name);

        Continuity.methodCall(className, name, SpriteFactory.className, factory.name, "setChar(" + character.name + "): void");
        factory.setChar(character);
        Continuity.methodExit(classInfo);
    }
    // játék állásának mentése

    public void saveGame() {
        String classInfo = name + "(" + className + ")::saveGame(): void";
        Continuity.methodEntry(classInfo);
        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    public void nextLevel() {
    }

    public void winGame() {
    }

    public void changeView(int view) {
    }

    public int getView() {
        String classInfo = name + "(" + className + ")::getView: int";
        Continuity.methodEntry(classInfo);
        if (Continuity.Question("Palya- (1) vagy palyaelem (2) nezetben vagyunk?", '1', '2')) {
            Continuity.methodReturn("Level", "actualLevel", className, name, "view=2");
            Continuity.methodExit(classInfo);
            return 1;
        } else {
            Continuity.methodReturn("Level", "actualLevel", className, name, "view=2");
            Continuity.methodExit(classInfo);
            return 2;
        }
    }

    public void openMenu() {
    }

    public void closeMenu() {
    }

    public void showCredits() {
    }

    public void move(int dir) {
    }
}
